/**
 * 认证控制器
 * 处理用户注册、登录和个人资料相关的逻辑
 */
const userModel = require('../models/userModel');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const logger = require('../utils/logger');

// JWT密钥
const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';

const authController = {
  /**
   * 用户注册
   * @param {Object} req - 请求对象
   * @param {Object} res - 响应对象
   * @param {Function} next - 下一个中间件函数
   */
  register: async (req, res, next) => {
    try {
      const { username, password, nickname } = req.body;

      // 检查用户名是否已存在
      const existingUser = await userModel.findByUsername(username);
      if (existingUser) {
        return res.status(400).json({ message: '用户名已被使用' });
      }

      // 创建新用户
      const user = await userModel.create({
        username,
        password,
        nickname
      });

      // 生成JWT令牌
      const token = jwt.sign(
        { id: user.id, username: user.username },
        JWT_SECRET,
        { expiresIn: '7d' }
      );

      res.status(201).json({
        message: '注册成功',
        user: {
          id: user.id,
          username: user.username
        },
        token
      });
    } catch (error) {
      logger.error(`注册错误: ${error.message}`);
      next(error);
    }
  },

  /**
   * 用户登录
   * @param {Object} req - 请求对象
   * @param {Object} res - 响应对象
   * @param {Function} next - 下一个中间件函数
   */
  login: async (req, res, next) => {
    try {
      const { username, password } = req.body;

      // 查找用户
      const user = await userModel.findByUsername(username);
      if (!user) {
        return res.status(401).json({ message: '用户名或密码不正确' });
      }

      // 验证密码
      const isMatch = await bcrypt.compare(password, user.password);
      if (!isMatch) {
        return res.status(401).json({ message: '用户名或密码不正确' });
      }

      // 生成JWT令牌
      const token = jwt.sign(
        { id: user.id, username: user.username },
        JWT_SECRET,
        { expiresIn: '7d' }
      );

      res.json({
        message: '登录成功',
        user: {
          id: user.id,
          username: user.username,
          nickname: user.nickname
        },
        token
      });
    } catch (error) {
      logger.error(`登录错误: ${error.message}`);
      next(error);
    }
  },

  /**
   * 获取用户资料
   * @param {Object} req - 请求对象
   * @param {Object} res - 响应对象
   * @param {Function} next - 下一个中间件函数
   */
  getProfile: async (req, res, next) => {
    try {
      const userId = req.user.id;
      const user = await userModel.findById(userId);
      
      if (!user) {
        return res.status(404).json({ message: '用户不存在' });
      }

      res.json({
        user: {
          id: user.id,
          username: user.username,
          nickname: user.nickname,
          avatar: user.avatar,
          bio: user.bio,
          created_at: user.created_at
        }
      });
    } catch (error) {
      logger.error(`获取用户资料错误: ${error.message}`);
      next(error);
    }
  },

  /**
   * 更新用户资料
   * @param {Object} req - 请求对象
   * @param {Object} res - 响应对象
   * @param {Function} next - 下一个中间件函数
   */
  updateProfile: async (req, res, next) => {
    try {
      const userId = req.user.id;
      const { nickname, avatar, bio } = req.body;

      const success = await userModel.update(userId, {
        nickname,
        avatar,
        bio
      });

      if (!success) {
        return res.status(400).json({ message: '更新失败' });
      }

      // 获取更新后的用户资料
      const updatedUser = await userModel.findById(userId);

      res.json({
        message: '资料已更新',
        user: {
          id: updatedUser.id,
          username: updatedUser.username,
          nickname: updatedUser.nickname,
          avatar: updatedUser.avatar,
          bio: updatedUser.bio
        }
      });
    } catch (error) {
      logger.error(`更新用户资料错误: ${error.message}`);
      next(error);
    }
  }
};

module.exports = authController; 